/*
其实，set容器在判定已有元素a和新插入元素b是否相等时，是这么做的：
1）将a作为左操作数，b作为有操作数，调用比较函数，并返回比较值
2）将b作为左操作数，a作为有操作数，再调用一次比较函数，并返回比较值。

如果1、2两步的返回值都是false，则认为a、b是相等的，则b不会被插入set容器中

如果1、2两步的返回值都是true，则可能发生未知行为

因此，记住一个准则：永远让比较函数对相同元素返回false。
     它是严格弱序化的
*/

#include <iostream>
#include <set>

struct song
{
    int m_id;
    int m_hot;
   
    song(int id, int hot) : m_id(id),m_hot(hot) {}

    bool operator<(const struct song& right) const
    {
         if(this->m_id == right.m_id)
         {
              return false;
         }     
         else{
              if(this->m_hot != right.m_hot){
                 return this->m_hot > right.m_hot;//先按hot降序
             }else{
                 return this->m_id > right.m_id;
            }
         } 
     }
};


int main()
{
     std::set<song> mySet;
     song s1(10,100);
     song s2(20,200);
     song s3(20,300);
     song s4(40,200);

     mySet.insert(s1);
     mySet.insert(s2);
     mySet.insert(s3);
     mySet.insert(s4);
     
     for(auto& it : mySet)
     {
        std::cout << "it: " << it.m_id << ",hot: " << it.m_hot << std::endl;
     }
}